import request from "@/utils/request";
import { PageResult } from "../base-class";

const VECTOR_BASE_URL = "/wz/api/vector";

/** 查询结果项 */
export interface QueryResult {
  /** 文件名称 */
  fileName: string;
  /** 文本内容 */
  text: string;
  /** 创建时间 */
  createTime: string;
}

/** 搜索响应结果 */
export interface SearchResp {
  /** 相似度得分 */
  score: number;
  /** 文本内容 */
  text: string;
}

/** 插入响应结果 */
export interface InsertResp {
  /** 插入状态 */
  status: string;
  /** 插入消息 */
  message: string;
}

/** 文件解析结果 */
export interface TikaVo {
  /** 文件名称 */
  fileName: string;
  /** 文本内容 */
  text: string;
  /** 分片列表 */
  paragraphs: string[];
}

/** 知识库管理接口 */
class VectorAPI {
  /**
   * 获取文本向量表示
   *
   * @param text 文本内容
   * @returns 向量表示字符串
   */
  static getEmbedding(text: string) {
    return request<any, string>({
      url: `${VECTOR_BASE_URL}/embedding`,
      method: "get",
      params: { text },
    });
  }

  /**
   * 添加自定义RAG数据
   *
   * @param text 文本内容
   * @returns 插入响应
   */
  static addCustomRagData(text: string) {
    return request<any, InsertResp>({
      url: `${VECTOR_BASE_URL}/addCustomRagData`,
      method: "get",
      params: { text },
    });
  }

  /**
   * 解析文件内容
   *
   * @param file 上传的文件
   * @returns 解析后的文本内容
   */
  static extractFileString(file: File) {
    const formData = new FormData();
    formData.append("file", file);
    return request<any, string>({
      url: `${VECTOR_BASE_URL}/extractFileString`,
      method: "post",
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
  }

  /**
   * 使用LangChain分片解析文件内容
   *
   * @param file 上传的文件
   * @returns 分片后的文本列表
   */
  static splitParagraphsLangChain(file: File) {
    const formData = new FormData();
    formData.append("file", file);
    return request<any, string[]>({
      url: `${VECTOR_BASE_URL}/splitParagraphsLangChain`,
      method: "post",
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
  }

  /**
   * 使用HanLP分片解析文件内容
   *
   * @param file 上传的文件
   * @returns 分片后的文本列表
   */
  static splitParagraphsHanLP(file: File) {
    const formData = new FormData();
    formData.append("file", file);
    return request<any, string[]>({
      url: `${VECTOR_BASE_URL}/splitParagraphsHanLP`,
      method: "post",
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
  }

  /**
   * 解析文件并分片
   *
   * @param file 上传的文件
   * @returns 文件解析结果
   */
  static extractFile(file: File) {
    const formData = new FormData();
    formData.append("file", file);
    return request<any, TikaVo>({
      url: `${VECTOR_BASE_URL}/extractFile`,
      method: "post",
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
  }

  /**
   * 上传知识库文件
   *
   * @param file 上传的文件
   * @returns 批量插入响应
   */
  static uploadFile(file: File) {
    const formData = new FormData();
    formData.append("file", file);
    return request<any, InsertResp>({
      url: `${VECTOR_BASE_URL}/uploadFile`,
      method: "post",
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
  }

  /**
   * 搜索相似文本
   *
   * @param text 搜索文本
   * @returns 搜索结果
   */
  static search(text: string) {
    return request<any, SearchResp>({
      url: `${VECTOR_BASE_URL}/search`,
      method: "get",
      params: { text },
    });
  }

  /**
   * 分页查询知识库数据集
   *
   * @param current 页码
   * @param size 每页大小
   * @param fileName 文件名（可选）
   * @returns 查询结果列表
   */
  static getPage(current: number, size: number, fileName?: string) {
    return request<any, PageResult<QueryResult[]>>({
      url: `${VECTOR_BASE_URL}/query`,
      method: "get",
      params: { current, size, fileName },
    });
  }
}

export default VectorAPI;
